﻿//小蓝最近在研究一种浮点数的表示方法：
//R 格式。对于一个大于
//0 的浮点数
//d，可以用
//R 格式的整数来表示。给定一个转换参数
//n，将浮点数转换为
//R 格式整数的做法是：
//将浮点数乘以
//四舍五入到最接近的整数。
//输入格式
//一行一个整数
//�
//n 和一个浮点数
//�
//d。
//
//输出格式
//一行一个整数表示
//�
//d 用
//�
//R 格式表示出的值。
//
//输入输出样例
//输入 #1复制
//2 3.14
//输出 #1复制
//13
//说明 / 提示
//样例 1 解释
//3.14
//×
//2
//2
//=
//12.56
//3.14×2
//2
//= 12.56，四舍五入后为
//13
//13。
//
//数据规模与约定
//用
//�
//t 表示将
//�
//d 视为字符串时的长度。
//
//对于
//50
//%
//50 % 的数据，保证
//�
//≤
//10
//n≤10，
//�
//≤
//15
//t≤15。
//对于全部的测试数据，保证
//1
//≤
//�
//≤
//1000
//1≤n≤1000，
//1
//≤
//�
//≤
//1024
//1≤t≤1024，保证
//d 是小数，即包含小数点。



#include<bits/stdc++.h>

//本题由于数据过大；故不能直接搞，故转化成字符串间接搞
using namespace std;
const int N = 1e6 + 1;
int ret[N] = { 0 }; int n; string s; int len;
void mul_carry() {
    for (int i = 1; i <= len; i++) ret[i] *= 2;
    for (int j = 1; j <= len; j++) {
        ret[j + 1] += ret[j] / 10;
        ret[j] %= 10;
    }
    ret[len + 1] ? len++ : 1;
}
int main() {

    cin >> n >> s;
    reverse(s.begin(), s.end());//逆转，方便进位
    int pos = s.find('.');
    s.erase(pos, 1);
    len = s.size();//获得长度，方便判断进位到哪
    for (int i = 0; i < len; i++) ret[i + 1] = s[i] - '0';//起始点从1开始放入整型数组；这样便于进位判断
    for (int i = 1; i <= n; i++) mul_carry();//依次乘2然后判断进位，把2^n拆成n个2；让数不那么大；
    if (ret[pos] >= 5)ret[pos + 1]++;//对应的pos位置就是字符串转化成ret数组原先小数点后那一位对应在ret数组的下标
    //(这也就是为什么ret数组下标要从1开始）
    for (int j = pos + 1; j <= len; j++) {//最后由于四舍五入还可能导致之前的整数部分发生进位操作，故还需判断一下
        ret[j + 1] += ret[j] / 10;
        ret[j] %= 10;

    }
    ret[len + 1] ? len++ : 1;
    for (int i = len; i > pos; i--) cout << ret[i];//只用逆序输出整数部分即可

}